package ar.com.logic.components.strategy;

import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import ar.com.logic.components.CoordenadasFijos;
import ar.com.logic.components.Numero;
import ar.com.logic.components.interfaces.IHistoricoRespuestas;
import ar.com.logic.components.interfaces.IMatrizPosiciones;
import ar.com.logic.evaluador.Respuesta;

public class EstrategiaDescartePosicionUnica extends Estrategia {
	private Integer posicionAChequear;
	private Integer valorChequeado;

	public EstrategiaDescartePosicionUnica(IMatrizPosiciones matriz,
			IHistoricoRespuestas historico) {
		super(matriz, historico);
	}

	@Override
	public void actualizarPorRespuestaEsperada(Respuesta r) {
		if (r.getCorrectos() == 1) {
			matriz.fijarValorParaPosicion(valorChequeado, posicionAChequear);
		} else if (r.getCorrectos() == 0 && r.getRegulares() == 0) {
			matriz.descartarValor(valorChequeado);
		} else if (r.getRegulares() == 1) {
			matriz.agregarAConocidos(valorChequeado, 0);
		}
	}

	@Override
	public List<Respuesta> getRespuestasEsperadas() {
		// TODO Auto-generated method stub
		return this.respuestasEsperadas;
	}

	private List<Respuesta> respuestasEsperadas = new Vector<Respuesta>();

	public String getNombre() {
		// TODO Auto-generated method stub
		return IEstrategia.DESCARTE_POS_UNICA;
	}

	public Numero getSiguienteNumero() {
		Iterator<Integer> descartados = matriz.obtenerDescartados().iterator();
		CoordenadasFijos fijos = matriz.obtenerValoresConPosicionUnica();

		Numero n = new Numero();

		for (int i = 1; i <= matriz.getMaxPosiciones(); i++) {
			if (fijos.tieneFijoEnPosicion(i)
					&& !matriz.equals(fijos.getFijoPosicion(i))) {
				n.agregarDigito(fijos.getFijoPosicion(i));
				valorChequeado = fijos.getFijoPosicion(i);
				posicionAChequear = i;
			} else {
				n.agregarDigito(descartados.next());
			}
		}
		Respuesta rEsperada = new Respuesta();
		rEsperada.addCorrectos();
		this.respuestasEsperadas.add(rEsperada);
		rEsperada = new Respuesta();
		rEsperada.addRegular();
		this.respuestasEsperadas.add(rEsperada);
		rEsperada = new Respuesta();
		this.respuestasEsperadas.add(rEsperada);

		return n;
	}

	@Override
	public boolean esCondicionEsperada(IMatrizPosiciones matriz,
			IHistoricoRespuestas historico) {
		// TODO Auto-generated method stub
		return matriz.obtenerValoresConPosicionUnica().getCantidadFijos() > 0
				&& matriz.obtenerDescartados().size() >= matriz
						.getMaxPosiciones() - 1;
	}

	@Override
	public Integer getPriority() {
		// TODO Auto-generated method stub
		return 6;
	}

	@Override
	public boolean esUnicaEjecucion() {
		// TODO Auto-generated method stub
		return false;
	}

}
